//
//  InteractiveViewController.h
//  BukaLive
//
//  Created by 曹飞 on 2017/6/20.
//  Copyright © 2017年 曹飞. All rights reserved.
//

#import "BKBaseLiveViewController.h"
#import <MBProgressHUD/MBProgressHUD.h>


#import "BKNewInteractiveView.h"
#import "BKTextInputView.h"
#import "BKSwitchInputView.h"
#import "BKChatModel.h"
#import "BKHtmlPageModel.h"
#import "NSObject+BusinessLogic.h"
#import "BKPPTModel.h"

#import "BKCountDownModel.h"
#import "BKEnableMicModel.h"
#import "BKUserSelectStatu.h"
#import "BKEablePenModel.h"
#import "BKMamberView.h"
#import "BKShareStreamModel.h"
#import "BKSnapShotModel.h"
#import "BKWebFileModel.h"



static NSInteger const maxInteractive = 1000; //(现在不限制人数了，暂时设置1000人)最多六个学生交互,加老师一共7个，如果老师又播放了一路电影，那就是8个
static NSInteger const memberViewTag = 2000; //用户列表页面tag值
static NSInteger const settingViewTag = 2001; //设置页面tag值

typedef void(^SaveSnapShotBlock)(BOOL complite);


@interface InteractiveViewController : BKBaseLiveViewController


//    解析视频有多少 video_
//解析视频的位置以及前后顺序 videomain
@property (nonatomic,strong) NSMutableArray * videoFrameArr ;
@property (nonatomic,strong) NSMutableArray * videomainFrameArr ;
@property (nonatomic,strong) NSMutableArray * videomainFrameFullArr;
@property (nonatomic,strong) NSMutableArray * docPagesArr ;
@property (nonatomic,strong) NSMutableArray * docPosArr ;
@property (nonatomic,strong) NSMutableArray * docsmainArr ;

//临时记录激光笔位置
@property (nonatomic,strong)BKPenLaserPositionModel * tempPenLaserPositionModel;



@property (nonatomic,strong) BKNewInteractiveView * interactiveView; //交互主视图

@property (nonatomic,strong) BKTextInputView * textInputChatView;//聊天输入框

@property (nonatomic,assign) NSInteger  maxInteractive; //目前算上老师7人， 1V6 ，本地1路，远程6路

@property (nonatomic,assign) long userNumCount; //用户数量



@property (nonatomic,strong) NSMutableArray * interactiveStreams; //自己的头像和远程流
@property (nonatomic,strong) NSMutableArray * userStatus; //记录房间用户状态 ，声音状态，视频状态，授权状态

@property (nonatomic,strong) NSMutableArray * dropStreams; // 移动走的流 （手势拖动起位置）


@property (nonatomic,weak) NSTimer * timera;
@property (nonatomic,weak) MBProgressHUD * hud;

@property (nonatomic,assign) BOOL firstSnapShot; //用于判断是否第一次同步快照
@property (nonatomic,assign) BOOL isPublish; //交互模式下判断自己是否已经发布视频
@property (nonatomic,assign) BOOL loadingEnd; //webloading状态
@property (nonatomic,assign) BOOL bukaPreparedH5; //记录h5的js是否可以执行的状态，初始状态NO

@property (nonatomic,assign) BOOL grantBrush; //记录学生授权状态， 老师默认是YES ，学生默认是NO

@property (nonatomic,assign) BOOL isBrushing; //记录是是否开启画笔
//@property (nonatomic,strong) BKHtmlPptModel * currentPPTModel;


@property (nonatomic,strong)UIImageView *imgView; //奖杯图片

@property (nonatomic,copy) SaveSnapShotBlock snapShotBlock;

@property (nonatomic,assign)int rpcNums; //日志相关，记录4003Rpc顺序 进入房间从0开始计数

@property (nonatomic,assign)long tempCubeRpcAddTime; //记录骰子消息的时间，判断是否需要处理



@property (nonatomic,strong)NSMutableArray * videoViewRecordArr; //记录突然异常掉线的其他流试图的位置



-(void)backLastView;

-(void)hasProblemLevelAction;


/**
 获取和个人的房间状态
 */
-(void)fetchRoomStatus:(void (^)(NSString *resultJson, NSError *error))block;

//显示课堂状态默认页面,连接信令成功，或者是判断老师进入或者离开的时候执行检查
-(void)checkStartTime;


#pragma mark - 以下方法默认都是老师的功能，学生有部分功能

-(void)brushChange:(NSString * )action withTouchWebView:(BKGestureWebView*)touchWebView;
-(void)whiteBoardBrushChange:(NSString * )action;

-(void)pkgBrushChange:(NSString * )action withTouchWebView:(BKGestureWebView*)touchWebView;
-(void)pkgWhiteBoardBrushChange:(NSString * )action;

//-(void)h5PageChange:(NSString * )changed;
-(void)h5PageChange:(NSString * )changed withWebView:(WKWebView*)webView withTouchWebView:(BKGestureWebView *)touchWebView;

//#pragma mark - 流控制 ,以userid判断最为准确，防止多加漏删
//-(void)addStreamToInteractiveStreams:(BukaStatus*)stream;
//
//-(void)removeStreamFromInteractiveStreamsWithUser:(User*)user;
//-(void)removeStreamFromInteractiveStreamsWithStream:(BukaStatus*)stream;
//老师推出房间之前先执行这个
-(void)saveAllFileSnapshot:(SaveSnapShotBlock)block;

#pragma mark - 视频快照恢复

-(void)recoverVideoSnapShot:(BOOL)isTeacher;
//恢复快照后，删除并停止不需要的已经播放的流
-(void)snapshotClearVideo;
//恢复快照后，需要删除并停止不需要的二路流和文档
-(void)snapshotClearFile;
//短线后马上删除二路流，重连后会自动回复
//-(void)snapshotClearSecondStream;
#pragma mark - 聊天窗口添加系统消息
-(void)addSystemMessage:(NSString *)message;


#pragma mark - 同步用户管理列表状态

//添加用户
-(void)addUserStatue:(User*)user;

//修改本地用户信息
-(void)updateUserInfo:(User*)user;

//删除的

-(void)removeUserStatus:(User*)user;


/**
 即是初始化也是更新用户状态列表 ,只更新第一页的
 */
-(void)updateUserStatuList;
/**
 刷新顶部头像列表mic状态
 */
-(void)updateMemberListHeadStreamView;


-(void)updateMemberList:(BKMamberView*)view;
/**
  更新用户列表属性

 @param model 用户的声音视频和授权状态
 
 */
-(void)updateUserStatus:(BKEnableMicModel *)model;

/**
 更新用户列表属性

 @param model 和上的方法编模型不同，请注意选取不同方法
 */
-(void)updateUserStatusWithStat:(BKUserSelectStatu *)model;

//更新自己用户列表下麦
-(void)updateUserStatusWithDownStageWithUser:(User*)user ;
//更新自己自己用户列表上麦 
-(void)updateUserStatusWithOnStageWithStatus:(BukaStatus*)status;
//更新用户列表上麦
-(void)updateUserStatusWithDownStageWithStatus:(BukaStatus*)status;

//获取一个流试图，主要用于回复断线重连用户再次推流，恢复视图位置
-(BKLiveSubView *)getOffLineUserStreamView:(User*)user withArr:(NSArray*)arr;

//恢复后删除相应记录
-(void)removeOffLineUserStreamViewLayout:(User*)user;


/**
 向队列里抛一个任务，n秒后执行，检查用户是否是真的掉线不回来了，如果判断用户列表里又有这个用户了，那就不做任何处理，否则就清空当前用户的流

 @param user user
 @param delay 秒
 @param block 用户是否回来了，如果回来了，那么就不管了，如果没回来，方法内已经停止播放流，外部可根据是否存在做一些其他的操作
 */


-(void)checkOffLineUser:(User*)user delay:(NSInteger)delay withHasUser:(void(^)(BOOL has))block;



/**
    打开聊天窗口
 */
-(void)showChatView;


/**
    打开设置窗口
 */
-(void)showSetting;



#pragma mark - 音视频相关操作


/**
 翻转摄像头

 @param sender 控件锁一定时间，防止快速切换的崩溃
 */
-(void)changeCamare:(id)sender;

/**
 是否关闭视频发送 ，前提是正在发布
 */
-(void)changePublishVideoStat;


/**
 是否关闭音频发送 ，前提是正在发布
 */
-(void)changePublishAudioStat;

/**
 某些情况下需要直接设置声音状态，本地操作，不会发信令

 @param stat YES，有声音，NO 没声音
 */
-(void)changePublishAudioStatWithStat:(BOOL)stat;

-(NSInteger)checkRemoteStudentStreamNum;


//同步某人是否隐藏头像
-(void)personVideoHideSnapShot;

#pragma mark - 发奖杯播放一段声音
-(void)playCupSound;

#pragma mark - 文档相册相关方法

#pragma mark -新东方通知推送


//发送新东方邀请别人参加会议功能 参数 @{"chatRoomId":@"会议id",@"VC":vc}
-(void)YBGInviterpersonAction:(BKButton*)btn;
//发送新东方共享文件功能  参数 @{"chatRoomId":@"会议id",@"VC":vc}
-(void)YBGShareFile:(BKButton*)btn;
//监听新东方的一个打开文档的功能
-(void)YGBOpenFile:(BKWebFileModel *) fileModel;
/**
 画笔按钮方法

 @param sender  sender
 */
-(void)brushBtnAction:(id)sender;

/**
 打开画笔
 */
-(void)brushJSAction;
/**
 处理文档翻页

 @param rpc rpc
 */
-(void)h5PPTRpc:(Rpc*)rpc;


/**
 处理文档画笔

 @param rpc rpc
 */
-(void)H5ActionRpc:(Rpc*)rpc;

/**
 接收单独画笔消息

 @param message 画笔消息
 */
-(void)pkgH5ActionRpc:(NSString*)message;


/**
 显示帮助页面
 */
-(void)showHelpView;

/**
 显示相册 选择要上传的照片
 */
-(void)showImagePicker;


/**
 提出非DOC，XLS，PPT，PDF文档的其他文件

 @param files 文件
 @return arr
 */

-(NSArray*)excludePictures:(NSArray <BKPPTModel*>*)files;


/**
 截取字符,获取文件类型

 @param sourceStr 文档名加后缀
 @return 文档后缀名
 */
-(NSString *)subStr:(NSString*)sourceStr;


/**
 轮询文档转换是否成功

 @param timer timera
 */
- (void)onTimer:(NSTimer *)timer;
/**
 转换文档  废弃

 @param downLoadUrl 文档下载地址
 @param type 文档类型
 */
//-(void)pptToH5:(NSString*)downLoadUrl
//      withType:(NSString*)type transForm:(NSString*)transFormType model:(BKPPTModel*)tempModel;

-(void)pptToH5:(NSString *)downLoadUrl withTransferType:(NSString *)transferType withTargetType:(NSString *)targetType withModel:(BKPPTModel * )tempModel;

@end
